/**
 * Copyright 2000 self.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 * 	The greatest achievement is selflessness. The greatest worth is self-mastery.
 * 	The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 * 	The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 * 	The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 * 	The greatest goodness is a peaceful mind. The greatest patience is humility.
 * 	The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 * 	The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 *
 * @author Ashin Wimalajeewa
 */
package self.amigo.diag.layer;

import java.util.*;
import org.w3c.dom.Document;
import org.w3c.dom.*;

import self.gee.*;
import self.xml.*;

final public class LayerPersistenceUtils {

	private LayerPersistenceUtils() {
    	// nothing to do.
	}
  
  final static public String ELEMENTS_TAG = "Elements";
  final static public String ID_ATTR = "id";
  
  static public void readFrom( Node self, HashMap idObjLookUp, IDiagramLayer layer ) throws DOMException {
    Node elems = DomUtils.getChildElementNode( self, ELEMENTS_TAG );
    initIdObjectMap( elems, idObjLookUp, layer );

    NodeList listOfElems = elems.getChildNodes();
    int max = listOfElems.getLength();
    for ( int cntr = 0; cntr < max; cntr++ ) {
      Node elem = listOfElems.item( cntr );
      if ( elem.getNodeType() != Node.ELEMENT_NODE )
        continue;
      String id = DomUtils.getElementAttribute( elem, ID_ATTR );
      IGraphicElement view = (IGraphicElement) idObjLookUp.get( id );
      view.readFrom( elem, idObjLookUp );
    }
  }
  
  static public void writeTo( List elements, Document doc, Element parent, HashMap objIdLookup ) throws DOMException {
    initObjectIdMap( elements, objIdLookup );
    Element elems = doc.createElement( ELEMENTS_TAG );
    if ( parent != null )
      parent.appendChild( elems );
    else
      doc.appendChild( elems );
    int max = elements.size();
    for ( int cntr = 0; cntr < max; cntr++ ) {
      IGraphicElement view = (IGraphicElement) elements.get( cntr );
      Element elem = doc.createElement( view.getClass().getName() );
      DomUtils.setElementAttribute( elem, ID_ATTR, "" + cntr  );
      elems.appendChild( elem );
      view.writeTo( doc, elem, objIdLookup );
    }
  }
  
  static private void initObjectIdMap( List elements, HashMap objIdLookup ) {
    int max = elements.size();
    for ( int cntr = 0; cntr < max; cntr++ ) 
      objIdLookup.put( elements.get(cntr), "" + cntr );
  }
  
  static private void initIdObjectMap( Node elementsNode, HashMap idObjLookUp, IDiagramLayer layer ) throws DOMException {
    NodeList listOfElems = elementsNode.getChildNodes();
    int max = listOfElems.getLength();
    for ( int cntr = 0; cntr < max; cntr++ ) {
      Node elem = listOfElems.item( cntr );
      if ( elem.getNodeType() != Node.ELEMENT_NODE )
        continue;
      String className = elem.getNodeName();
      String id = DomUtils.getElementAttribute( elem, ID_ATTR );
      IGraphicElement view = null;
      try {
        view = (IGraphicElement) Class.forName( className ).newInstance();
        view.setLayer( layer, true );
      } catch ( Exception err ) {
        err.printStackTrace();
        throw new DOMException( DOMException.NOT_FOUND_ERR, err.getMessage() );
      }
      idObjLookUp.put( id, view );
    }
  }
}
